package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.model.Implante;
import br.com.os2.pacemark.model.ProdutoUsado;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * Classe ProdutoUsadoDAO, extende a classe DAOGenerico para obeter recursos de
 * conexão e excução de consultas e comandos.
 *
 * Responsável por gerenciar acesso ao banco de dados relacionados a Entidade
 * ProdutoUsado.
 *
 * @author Daniel
 *
 */
public class ProdutoUsadoDAO extends DAOGenerico {

    /**
     * Método para inserir um produtoUsado.
     *
     * @param produtoUsado Objeto produtoUsado a ser inserido.
     * @return boolean indica se o método foi executado com sucesso.
     *
     *
     */
    public boolean inserir(ProdutoUsado produtoUsado) {

        produtoUsado.setId(getNextId("produtos_usados"));

        return executarComando("INSERT INTO produtos_usados (id, quantidade, produto_id, "
                + "implante_id) VALUES (?,?,?,?)", produtoUsado.getId(), produtoUsado.getQuantidade(), produtoUsado.getProduto().getId(), produtoUsado.getImplante().getId());

    }

    /**
     * Método para excluir um produtoUsado.
     *
     * @param produtoUsado Objeto produtoUsado a ser excluído.
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean excluir(ProdutoUsado produtoUsado){

        return executarComando("DELETE FROM produtos_usados WHERE id = ?", produtoUsado.getId());

    }

    /**
     * Método para excluir um produtoUsado.
     *
     * @param id ID do objeto a ser excluído
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean excluir(int id){

        return executarComando("DELETE FROM produtos_usados WHERE id = ?", id);

    }

    /**
     * Método para buscar o produtoUsado pelo ID
     *
     * @return ProdutoUsado correspondente ai ID, se não for encontrado retorna
     * null.
     *
     * @param id inteiro que representa o ID do produtoUsado na tabela
     *
     *
     */
    public ProdutoUsado getById(int id) {

        ResultSet rs = executarConsulta("SELECT * FROM produtos_usados WHERE id = ?", id);

        ProdutoUsado produtoUsado = null;

        try {

            ProdutoDAO produtoDAO = new ProdutoDAO();
            ImplanteDAO implanteDAO = new ImplanteDAO();

            if (rs.next()) {

                produtoUsado = polularInformacoes(rs, produtoDAO, implanteDAO);

            }

        } catch (SQLException ex) {

            System.err.println("ERRO AO BUSCAR PRODUTO_USADO POR ID");

        } finally {

            try {

                rs.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return produtoUsado;

    }

    /**
     * Método para listagem de produtosUsados.
     *
     * @param implante para filtrar os produtos usados no implante passado como
     * parametro
     *
     * @return Retorna uma lista de produtosUsados com o resultado da consulta
     *
     *
     */
    public List<ProdutoUsado> listar(Implante implante) {

        List<ProdutoUsado> produtosUsados = new ArrayList<>();

        ResultSet rs = executarConsulta("SELECT * FROM produtos_usados WHERE implante_id = ?", implante.getId());

        try {

            ProdutoDAO produtoDAO = new ProdutoDAO();
            ImplanteDAO implanteDAO = new ImplanteDAO();

            while (rs.next()) {

                produtosUsados.add(polularInformacoes(rs, produtoDAO, implanteDAO));

            }

        } catch (SQLException ex) {

            System.err.println("ERRO AO PERCORER RESULT_SET");

        } finally {

            try {

                rs.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return produtosUsados;

    }

    /**
     * Método para preencher informações de um produtoUsado com resultados do
     * banco de dados.
     *
     * @param rs ResultSet com o resultado de uma consulta SQL
     *
     * @param produtoDAO DAO de produto
     *
     * @param implanteDAO DAO de implante
     *
     * @return Retorna um produtoUsado populado com informações vindas do banco
     * de dados
     *
     *
     */
    public ProdutoUsado polularInformacoes(ResultSet rs, ProdutoDAO produtoDAO, ImplanteDAO implanteDAO) {

        ProdutoUsado produtoUsado = new ProdutoUsado();

        try {

            produtoUsado.setId(rs.getInt("id"));
            produtoUsado.setQuantidade(rs.getInt("quantidade"));
            produtoUsado.setProduto(produtoDAO.getById(rs.getInt("produto_id")));
            produtoUsado.setImplante(implanteDAO.getById(rs.getInt("implante_id")));

        } catch (SQLException ex) {

            System.err.println("ERRO AO PULULAR PRODUTO_USADO");

        }

        return produtoUsado;

    }

}
